합성곱 층은 랭커3의 텐서를 입력으로 기대한다. N1xN2 입력층을 채널(channel)이라고 하면
3차원 배열 X_N1xN2xCin에서 Cin은 입력 채널 크기이다.
RGB 컬러의 경우 Cin=3이다.
Greyscale이라면 Cin=1
이미지는 16bit, 32bit, 64bit 정수 타입 대신 uint8(unsigned 8bit 정수) 데이터 타입으로 읽는다.
tensorflow tf.io(이미지 로드)/tf.image(저장, 조작)
import tensorflow as tf
img_raw=tf.io.read_file('example-image.png')
img=tf.image.decode_image(img_raw)
print('이미지 크기:', img.shape)
imageio 패키지
$pip3 install imageio
import imageio
img=imageio.imread('example-image.png')
print('이미지 크기:', img.shape)
print('채널 개수:', img.shape[2])
print('이미지 데이터 타입:, img.dtype)
print(img[100:102, 100:102, :]
합성곱 연산에서 여러개의 입력 채널에 대해서 각 채널별로 합성곱 연산을 수행하고 행렬 덧셈으로 결과를 합친다.
채널(C)별 합성곱은 개별적인 커널 행렬 W[:, :, c]를 사용한다.
보통의 합성곱 층은 하나 이상의 특성 맵을 만든다.
여러 개의 특성 맵을 사용하면 커널 텐서는 height x width x C_in x C_out으로 4차원이 된다.
X(n1 x n2 x C)
W(m1 x m2 x C_in x C_out)
b(C_out)
ex)가중치 개수 비교입력 채널이 3개, 커널 텐서는 4차원이다
각 커널 행렬은 m1 x m2 크기이고, 입력 채널에 한개씩 3개, 이런 커널 텐서가 다섯 개의 출력 특성 맵을 만들기 위해 5개 있다.
m1 x m2 x 3(c_in) x 5(c_out)
커널의 가중치 개수는 m1xm2x3x5개 이며,
합성곱 층의 출력 특성 맵마다 절편이 있기 때문에(절편 벡터의 크기는 5)
커널은 m1xm2x3x5+5의 가중치 개수를 가진다.
완전 연결층일 경우
가중치 행렬의 파라미터 개수는(세임패딩일 경우)
(n1xn2x3)x(n1xn2x5)=3x5x(n1xn2)^2
이고 절편 벡터의 크기는 n1xn2x5개로
필요한 파라미터의 개수 차이가 매우 크다.
합성곱 연산에서 여러 컬러 채널을 가진 입력 이미지를 2차원 행렬을 쌓은 것처럼 다룬다.
3D 데이터셋을 사용한다면 합성곱 연산을 3D로 확장할 수 있다.